<?php
/**
 *
 * @author Mr.UBKey
 * @package XPHP
 * @version Beta
 * @copyright XWEB
 */
require_once 'XPHP/Model.php';
class XPHP_View
{
	/**
	 * Router lưu thông tin về area, controller, action
	 * @var XPHP_Router
	 */
	protected $_router; 
	
	/**
	 * Tên thư mục chứa view
	 * @var string
	 */
	protected $_viewDir = "views";
	
	/**
	 * Phần đuôi mở rộng của View
	 */
	protected $_viewExt = "phtml";
	
	/**
	 * Model trả về từ controller
	 * @var XPHP_Model
	 */
	protected $_model;
	
	/**
	 * Dữ liệu chuyển từ controller sang view
	 * @var unknown_type
	 */
	protected $_viewData;
		
	/**
	 * Kết quả trả về từ controller
	 */
	protected $_controllerResult;
	
	/**
	 * Layout của view
	 * @var XPHP_Layout
	 */
	protected $_layout;
	
	/**
	 * Lớp hỗ trợ view
	 * @var XPHP_View_Helper
	 */
	public $_helper;
	
	/**
	 * Lớp khởi tạo View
	 * @param XPHP_Router $router
	 */
	public function __construct($router)
	{
		$this->_router = $router; // Gán Router
		//Khởi tạo Layout
		$this->_layout = new XPHP_Layout($router, $this);
		//Khởi tạo lớp hỗ trợ
		$this->_helper = new XPHP_View_Helper($router);
		
		//Lấy ra danh sách các ViewData định nghĩa trong file config
		$this->getConfigViewData();
	}
	
	public function getDefaultViewPath()
	{
		$area = $this->_router->getArea();
		//Nếu có area
		if(!empty($area))
		{
			$path = $this->_router->getAreaPaths($this->_router->getArea())
					. '/' . $this->_viewDir . '/' . $this->_router->getController()
				    . '/' . $this->_router->getAction() . '.' . $this->_viewExt;
			//Xử lý trả về kết quả
			if(is_file($path))
				return $path;
			else 
			{
				require_once 'XPHP/Exception.php';
				throw new XPHP_Exception("Không tìm thấy tệp tin View $path của " 
										 . $this->_router->getArea() . $this->_router->getAreaKey() .  "_"
										 . $this->_router->getController() . $this->_router->getControllerKey());
			}
		}
		//Nếu không có area
		else
		{
			$path = $this->_router->getApplicationDir() . '/' . $this->_viewDir
					. '/' . $this->_router->getController() 
					. '/' . $this->_router->getAction() . '.' . $this->_viewExt;
			//Xử lý trả về kết quả
			if(is_file($path))
				return $path;
			else 
			{
				require_once 'XPHP/Exception.php';
				throw new XPHP_Exception("Không tìm thấy tệp tin View $path của " 
										 . $this->_router->getController() . $this->_router->getControllerKey());
			}
		}
	}
	
	public function ExecuteControllerResult()
	{
		//Gán View và Layout cho XPHP_View_Result
		if($this->_controllerResult instanceof XPHP_View_Result)
		{
			$this->_controllerResult->setView($this);
			$this->_controllerResult->setLayout($this->_layout);
			$this->_controllerResult->setModel($this->_model);
			$this->_controllerResult->setHelper($this->_helper);
		}			
		$this->_controllerResult->ExecuteResult();
	}
	
	public function setViewData($data, $override=false)
	{
		if($override)
			$this->_viewData = $data;
		else 
		{
			foreach ($data as $key => $value)
			{
				$this->_viewData->$key = $value;
			}
		}
	}
	
	public function getViewData()
	{
		return $this->_viewData;
	}
	
	public function setControllerResult(XPHP_View_Result_Interface $result)
	{
		$this->_controllerResult = $result;
	}
	
	public function getControllerResult()
	{
		return $this->_controllerResult;
	}
	
	public function setLayout($layout)
	{
		$this->_layout = $layout;
	}
	
	public function getLayout()
	{
		return $this->_layout;
	}
	
	public function getModel()
	{
		return $this->_model;
	}
	
	public function setModel($model)
	{
		$this->_model = $model;
	}
	
	public function getRouter()
	{
		return $this->_router;
	}
	
	private function getConfigViewData()
	{
		if(isset(XPHP_Registry::get("config")->view))
		{
			foreach (XPHP_Registry::get("config")->view as $key => $value) 
			{
				$this->_viewData->$key = $value;
			
			}
		}
	}
}